AI 도구 개발

AI챗봇_01_메모리 1GB 서버에 스프링 올리기

작성자 : Heehyeon Yoo|2026-01-10
# Project# DevLog# Docker# Spring# Optimization

챗봇을 만들어보고 싶다

제대로 된 RAG(Retrieval-Augmented Generation) 기반 챗봇 하나 구현해보는 것도 좋은 경험이라고 생각했다.

무슨 서비스에 붙여볼까 고민하다가, '그냥 지금 운영하는 이 블로그에 붙이면 되잖아?' 하고 생각했다.
마크다운 문서도 꽤 쌓여있으니, 이걸 베이스로 내 블로그 내용을 답변해주는 챗봇이 될 것이다.
필요하다면 티켓 기능도 챗봇 내에서 추가해서, 나에게 피드백이 전달되는 창구도 하나 만들면 되겠다 싶었다.

Kotlin이랑 Spring Boot 생태계도 공부하는 겸,
이번 기회에 아예 백엔드 서버를 스프링으로 구현해서 블로그(Next.js) 뒤에 붙여보기로 했다.
프론트는 Next.js가 하고, 백엔드는 Spring이 받아서 AI랑 통신하는 구조다.

가난한 서버 스펙

문제는 내 블로그가 돌아가고 있는 Oracle Cloud Free Tier 인스턴스다.
RAM 1GB짜리 E2.1.Micro 인스턴스를 쓰고 있는데, 이미 Next.js랑 이것저것 돌리느라 메모리 점유율이 50%를 넘나든다.
여기에 무겁기로 소문난 JVM(Spring Boot)을, 그것도 Docker Container로 띄우는 게 과연 가능할까 싶다.
포기하거나 서버 스펙을 올리는게 맞겠지만, 오라클 서울 리전은 ARM 인스턴스 품귀라 업그레이드도 어렵다.... 나도 쓰고 싶다.

Native 실행(java -jar)하면 도커 없이 그냥 프로세스로 띄울 수는 있을 것이다.
오버헤드가 적어서 돌아는 가겠지만 환경 설정이 지저분해진다. 무엇보다 요즘 시대에 도커 없이 배포한다는 게 영 찜찜하다.

결국 Docker로 강행돌파 해야겠다고 생각했다. 어떻게든 경량화해서 컨테이너로 띄운다.
지금 상황에 맞춰 편하게 하려면 Native가 맞지만, "메모리 제약 환경에서 도커를 운영하는 경험" 자체가 엔지니어링 경험에 훨씬 가치 있을 것 같다.
삽질좀 하지 뭐....

경량화 생존 전략

1GB 램에 스프링 컨테이너를 구겨 넣기 위해 찾아본 경량화 전략들은 이렇다.

  1. Alpine Linux(Docker Image): 자바가 돌아갈 도커 컨테이너의 베이스 이미지를 가장 가벼운 녀석(Alpine)으로 쓴다. 우분투 베이스보다 수백 MB는 아낄 수 있다.
  2. JVM 튜닝: 힙 메모리(Heap Size)를 256MB 정도로 강제 제한(-Xmx256m)한다. 가비지 컬렉터(GC)가 좀 고생하겠지만 서버가 터지는 것보단 낫다.
  3. DB 분리: Redis 같은 DB까지 도커로 띄우면 진짜 터질 것 같아서, DB는 호스트 OS에 직접 설치해서 메모리를 아낀다.

일단 목표는 "안 뻗고 돌아가는 것"이다.